var treeId = '#treeArea';
var treeMenuId = '#treeMenu';
var NODE;//当前操作节点
/**
 * 节点操作说明 add,edit,addChild
 */
var nodeOperation="";
/*
 * node's parameters 
 * id: 		An identity value bind to the node. 
 * text: 	Text to be showed. 
 * iconCls: The css class to display icon. 
 * checked: Whether the node is checked. 
 * state: 	The node state, 'open' or 'closed'. 
 * attributes: Custom attributes bind to the node. 
 * target: Target DOM object.
 */
$(document).ready(function() {
	// var jsonTree;
	getFunctionTreeDirect();
});

function getFunctionTree(){
	$(treeId).empty();
	var url = 'manage/getFunRootJson.do?timeflag='+Math.random();
	
	$.getJSON(url, function(data) {
		dealJsonToTree(data, $(treeId));
	});
}
function refreshTree(){
	setTimeout(function(){
		var url = 'manage/getFunRootJson.do?timeflag='+Math.random();
		$.getJSON(url, function(data) {
			$(treeId).tree('loadData',data.children);
		});
	}, 100);
}

/**
 * 获取功能树
 */
function getFunctionTreeDirect() {
	$(treeId).empty();
	var url = 'manage/getFunRootJson.do?timeflag='+Math.random();
	
	$.getJSON(url, function(data) {
		$(treeId).tree({
			data:data.children,
			onDblClick : function(node) {
				$(treeId).tree('select', node.target);
				f = $(treeId).tree('isLeaf', node.target);
				// alert('isLeaf:'+f);
				if (!f) {
					$(treeId).tree('toggle', node.target);
				}
			},
			onContextMenu : function(e, node) {
				e.preventDefault();
				// select the node
				$(treeId).tree('select', node.target);

				// display context menu
				$(treeMenuId).menu('show', {
					left : e.pageX,
					top : e.pageY
				});
				return false;
			}
		});
	});
	$(treeMenuId).menu({
		onHide : function() {
			triggerAllMenuItem(true);
		}
	});

	$(treeId).bind('contextmenu', function(e) {
		if (null == $(treeId).tree('getSelected')) {
			// triggerAllMenuItem(false);
			triggerMenuItem('#menu_item_editNode', false);
			triggerMenuItem('#menu_item_dropNode', false);
			triggerMenuItem('#menu_item_addChild', false);
		}

		$(treeMenuId).menu('show', {
			left : e.pageX,
			top : e.pageY
		});
		return false;
	});
}


function dealJsonToTree(json, $obj) {
	var $li = $('<li></li>').attr('id', json.id).attr('url', json.url).append(
			$('<span></span>').text(json.text));
	$obj.append($li);

	if (undefined != json.children || null != json.children) {
		var $parentUl = $('<ul></ul>');
		$li.append($parentUl);
		dealJsonToTreeAddSubs(json.children, $parentUl);
	}

	$obj.tree({
		// onDblClick,onClick
		onDblClick : function(node) {
			$(treeId).tree('select', node.target);
			f = $(treeId).tree('isLeaf', node.target);
			// alert('isLeaf:'+f);
			if (!f) {
				$(treeId).tree('toggle', node.target);
			}
		},
		onContextMenu : function(e, node) {
			e.preventDefault();
			// select the node
			$(treeId).tree('select', node.target);

			// display context menu
			$(treeMenuId).menu('show', {
				left : e.pageX,
				top : e.pageY
			});
			return false;
		},
		tools : [ {
			iconCls : 'icon-reload',
			text : '重新加载树',
			handler : function() {
				getFunctionTree();
			}
		} ]
	});

	$(treeMenuId).menu({
		onHide : function() {
			triggerAllMenuItem(true);
			// alert('hide');
		}
	});

	$(treeId).bind('contextmenu', function(e) {
		if (null == $(treeId).tree('getSelected')) {
			// triggerAllMenuItem(false);
			triggerMenuItem('#menu_item_editNode', false);
			triggerMenuItem('#menu_item_dropNode', false);
			triggerMenuItem('#menu_item_addChild', false);
		}

		$(treeMenuId).menu('show', {
			left : e.pageX,
			top : e.pageY
		});
		return false;
	});
}
/**
 * 切换菜单所有菜单项是否可用。
 * 
 * @param flag
 *            boolean true or false
 */
function triggerAllMenuItem(flag) {
	if (flag) {
		$(treeMenuId).find('div').each(function(i, dom) {
			$(treeMenuId).menu('enableItem', dom);
		});
	} else {
		$(treeMenuId).find('div').each(function(i, dom) {
			$(treeMenuId).menu('disableItem', dom);
		});
	}
}
/**
 * 切换单个菜单是否启用
 * 
 * @param itemId
 *            菜单项id，带'#'号
 * @param flag
 *            启用否：true or false
 */
function triggerMenuItem(itemId, flag) {
	if (flag) {
		$(treeMenuId).menu('enableItem', $(itemId)[0]);
	} else {
		$(treeMenuId).menu('disableItem', $(itemId)[0]);
	}
}

/**
 * 循环添加子节点。
 * 
 * @param nodes
 *            子节点列表
 * @param parentUl
 *            要添加到的UL
 */
function dealJsonToTreeAddSubs(nodes, parentUl) {
	$.each(nodes, function(i, node) {
		var $li = dealJsonToTreeAddNode(node, parentUl);

		if (undefined != node.children || null != node.children) {
			var $parentUl = $('<ul></ul>');
			$li.append($parentUl);
			dealJsonToTreeAddSubs(node.children, $parentUl);
		}
	});
}
/**
 * 添加一个节点到父列表中。
 * 
 * @param node
 * @param $parentUl
 * @returns 返回刚添加的节点。
 */
function dealJsonToTreeAddNode(node, $parentUl) {
	var $li = $('<li></li>').attr('id', node.id).attr('url', node.url).append(
			$('<span></span>').text(node.text));
	$parentUl.append($li);
	return $li;
}

// ///以下是测试功能
function getCurrentNode() {
	var node = $(treeId).tree('getSelected');
	alert('当前选择的节点是：' + node.id + " " + node.text);
}

function editNode() {
	// alert('Edit');
	$('#dialog_edit').remove();
	$('<div></div>').attr('id', 'dialog_edit').appendTo('body');
	NODE = $(treeId).tree('getSelected');
	var url = 'manage/getFunNode.do?typeFlag=update&id='.concat(NODE.id);
	var formUrl = 'manage/updateFunNodeJson.do';
	nodeOperation='edit';
	submitAsynDialogForm("#dialog_edit", url, formUrl, '用户功能树-编辑节点信息');
}

function addNode() {
	$('#dialog_add').remove();
	$('<div></div>').attr('id', 'dialog_add').appendTo('body');
	NODE = $(treeId).tree('getSelected');
	if(null == NODE) {
		var nowNode = $(treeId).find('div.tree-node')[0];
		NODE = $(treeId).tree('find',$(nowNode).attr('node-id'));
		$(treeId).tree('select',NODE.target);
		NODE = $(treeId).tree('getSelected');
	}
	var url = 'manage/addFunNode.do?typeFlag=add&relativeNode='.concat(NODE.id);
	var formUrl = 'manage/saveFunNodeJson.do';
	nodeOperation="add";
	submitAsynDialogForm("#dialog_add", url, formUrl, "用户功能树-添加节点信息");
}
function addChildNode() {
	//alert("用户功能树-添加子节点信息");
	$('#dialog_addChild').remove();
	$('<div></div>').attr('id', 'dialog_addChild').appendTo('body');
	NODE = $(treeId).tree('getSelected');
	var url = 'manage/addFunNode.do?typeFlag=add&parentId='.concat(NODE.id);
	var formUrl = 'manage/saveFunNodeJson.do';
	nodeOperation="addChild";
	submitAsynDialogForm("#dialog_addChild", url, formUrl, "用户功能树-添加子节点信息");
}
/**
 * 删除一个功能节点
 */
function dropNode() {
	NODE = $(treeId).tree('getSelected');
	$.messager.confirm('信息提示','确认要删除节点 '+NODE.text+" ?",function(f){
		if(f==true){
			$.getJSON('manage/delFunNodeJson.do?id='+NODE.id,function(resp){
				delNodeCallback(resp);
			});
		}
	});
}
/**
 * 显示一个异步提单的Form对话框
 * @param dialogId 对话框id（'#dialog_id'）
 * @param pageUrl 对话框显示内容页面地址
 * @param submitUrl 页面提交地址
 * @param _title 标题。
 */
function submitAsynDialogForm(dialogId, pageUrl,submitUrl,_title) {
	$(dialogId).dialog({
		loadingMessage : '正在加载。。。。',
		title : _title,
		modal : true,
		resizable : true,
		iconCls : 'icon-edit',
		width : 500,
		height : 300,
		href : pageUrl,
		buttons : [ {
			text : '保存',
			iconCls : 'icon-save',
			handler : function() {
				var form = $(dialogId).find('form')[0];
				$(form).form('submit', {
					url : submitUrl,
					success : function(resp) {
						submitCallBack(resp, dialogId);
					}
				});

			}
		}, {
			text : '取消',
			iconCls : 'icon-cancel',
			handler : function() {
				$(dialogId).dialog('close');
			}
		} ]
	});
}
/**
 * 表单提交后的回调函数
 * @param resp 返回值
 * @param dialogId 当前对话框id
 */
function submitCallBack(resp,dialogId){
	$(dialogId).dialog('close');
	if (null != resp) {
		var data = jQuery.parseJSON(resp);
		if (null != data.msg) {
			$.messager.alert("信息提示",data.msg);
		} else {
			if (data.code == 'ok') {
				$.messager.alert("信息提示",'操作成功');
			} else {
				$.messager.alert("信息提示","操作失败");
			}
		}
		if (data.code == 'ok' && null != data.datas) {
			
			if(nodeOperation == 'edit'){
				$(treeId).tree('update',{
					target	:NODE.target,
					text	:'['+data.datas.id+']'+data.datas.name
				});
			}
			if(nodeOperation == 'add'){
				var parentNode = $(treeId).tree('find',data.datas.parentId);
				$(treeId).tree('append',{
					parent	:parentNode.target,
					data	:[{
						id		:data.datas.id,
						text	:'['+data.datas.id+']'+data.datas.name
					}]
				});
			}
			if(nodeOperation == 'addChild'){
				$(treeId).tree('append',{
					parent	:NODE.target,
					data	:[{
						id		:data.datas.id,
						text	:'['+data.datas.id+']'+data.datas.name
					}]
				});
			}
		}
		//refreshTree();
	}
}
function delNodeCallback(data){
	if (null != data) {
//		var data = jQuery.parseJSON(resp);
		if (null != data.msg) {
			$.messager.alert("信息提示",data.msg);
		} else {
			if (data.code == 'ok') {
				alert('操作成功');
			} else {
				alert("操作失败");
			}
		}
		if(data.code == 'ok'){
			$(treeId).tree('remove',NODE.target);
		}
	}
}


function testAddNode(){
	var setting={
			data:[{
				id: $('#treeNodeId').val(),
				text: '['+$('#treeNodeId').val()+']'+$('#treeNodeName').val()
			}]	
	};
	var parent = $('#treeNodeParentId').val();
	if(''!=parent){
		var parentNode = $(treeId).tree('find',parent);
		setting.parent=parentNode.target;
	}
	
	$(treeId).tree('append',setting);
}
//不成功
function testInsertNode(){
	var parent = $('#treeNodeParentId').val();
	var parentNode = $(treeId).tree('find',parent);
	var setting={
			after:parentNode.target,
			data:[{
				id: $('#treeNodeId').val(),
				text: '['+$('#treeNodeId').val()+']'+$('#treeNodeName').val()
			}]	
	};
	$(treeId).tree('insert',setting);
}
function testDelNode(){
	var nodeId = $('#treeNodeId').val();
	var node = $(treeId).tree('find',nodeId);
	$(treeId).tree('remove',node.target);
}